//
//  DMFacebookCallbackForwarder.h
//  DualMediationSDK
//
//  Facebook回调转发器
//  负责将Facebook SDK的回调转发给注册的代理
//

#import <Foundation/Foundation.h>
#import "../Types/DMLifecycleTypes.h"
#import "../Types/DMLifecycleProtocols.h"

NS_ASSUME_NONNULL_BEGIN

#pragma mark - Facebook回调转发结果

/**
 * Facebook回调转发结果
 */
typedef NS_ENUM(NSUInteger, DMFacebookForwardResult) {
    DMFacebookForwardResultSuccess = 0,      // 转发成功
    DMFacebookForwardResultNoHandlers,       // 没有处理器
    DMFacebookForwardResultPartialFailure,   // 部分失败
    DMFacebookForwardResultFailure,          // 转发失败
    DMFacebookForwardResultTimeout           // 转发超时
};

#pragma mark - Facebook回调统计

/**
 * Facebook回调转发统计信息
 */
@interface DMFacebookForwardStatistics : NSObject
@property (nonatomic, assign) NSUInteger totalForwards;        // 总转发次数
@property (nonatomic, assign) NSUInteger successfulForwards;   // 成功转发次数
@property (nonatomic, assign) NSUInteger failedForwards;       // 失败转发次数
@property (nonatomic, assign) NSTimeInterval totalForwardTime; // 总转发时间
@property (nonatomic, assign, readonly) NSTimeInterval averageForwardTime; // 平均转发时间
@end

#pragma mark - Facebook回调转发器

/**
 * Facebook回调转发器
 * 负责接收Facebook SDK的各种回调并转发给注册的代理
 */
@interface DMFacebookCallbackForwarder : NSObject

#pragma mark - 单例访问

/**
 * 获取共享实例
 */
+ (instancetype)sharedForwarder;

#pragma mark - 转发配置

/**
 * 是否启用异步转发
 * 默认为YES
 */
@property (nonatomic, assign) BOOL asyncForwardEnabled;

/**
 * 转发超时时间（秒）
 * 默认为5.0秒
 */
@property (nonatomic, assign) NSTimeInterval forwardTimeout;

/**
 * 是否启用统计功能
 * 默认为NO
 */
@property (nonatomic, assign) BOOL statisticsEnabled;

/**
 * 是否启用调试模式
 * 默认为NO
 */
@property (nonatomic, assign) BOOL debugModeEnabled;

#pragma mark - Facebook登录回调转发

/**
 * 转发Facebook登录成功回调
 * @param result 登录结果
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardLoginSuccess:(DMLoginResponse *)result;

/**
 * 转发Facebook登录失败回调
 * @param error 登录错误
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardLoginFailure:(NSError *)error;

/**
 * 转发Facebook登录取消回调
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardLoginCancel;

/**
 * 异步转发Facebook登录结果
 * @param result 登录结果（成功时非nil，失败或取消时为nil）
 * @param error 错误信息（失败时非nil）
 * @param cancelled 是否被取消
 * @param completion 完成回调
 */
- (void)forwardLoginResultAsync:(nullable DMLoginResponse *)result
                          error:(nullable NSError *)error
                      cancelled:(BOOL)cancelled
                     completion:(nullable void(^)(DMFacebookForwardResult result))completion;

#pragma mark - Facebook分享回调转发

/**
 * 转发Facebook分享成功回调
 * @param result 分享结果数据
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardShareSuccess:(NSDictionary *)result;

/**
 * 转发Facebook分享失败回调
 * @param error 分享错误
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardShareFailure:(NSError *)error;

/**
 * 转发Facebook分享取消回调
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardShareCancel;

/**
 * 异步转发Facebook分享结果
 * @param result 分享结果（成功时非nil）
 * @param error 错误信息（失败时非nil）
 * @param cancelled 是否被取消
 * @param completion 完成回调
 */
- (void)forwardShareResultAsync:(nullable NSDictionary *)result
                          error:(nullable NSError *)error
                      cancelled:(BOOL)cancelled
                     completion:(nullable void(^)(DMFacebookForwardResult result))completion;

#pragma mark - Facebook Graph API回调转发

/**
 * 转发Facebook Graph API请求成功回调
 * @param result API响应结果
 * @param request 原始请求信息
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardGraphAPISuccess:(id)result request:(NSDictionary *)request;

/**
 * 转发Facebook Graph API请求失败回调
 * @param error API错误
 * @param request 原始请求信息
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardGraphAPIFailure:(NSError *)error request:(NSDictionary *)request;

#pragma mark - Facebook应用事件回调转发

/**
 * 转发Facebook应用事件记录回调
 * @param eventName 事件名称
 * @param parameters 事件参数
 * @param success 是否成功
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardAppEventLogged:(NSString *)eventName
                                      parameters:(nullable NSDictionary *)parameters
                                         success:(BOOL)success;

#pragma mark - Facebook URL处理

/**
 * 处理Facebook URL打开
 * @param url 要处理的URL
 * @param options 打开选项
 * @return 是否成功处理
 */
- (BOOL)handleOpenURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options;

/**
 * 处理Facebook用户活动继续
 * @param userActivity 用户活动
 * @param restorationHandler 恢复处理器
 * @return 是否成功处理
 */
- (BOOL)handleContinueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * _Nullable restorableObjects))restorationHandler;

/**
 * 处理Facebook登录结果
 * @param resultCode 结果代码
 * @param data 结果数据
 * @return 转发结果
 */
- (DMFacebookForwardResult)handleFacebookLoginResult:(NSInteger)resultCode data:(nullable id)data;

#pragma mark - 通用Facebook回调转发

/**
 * 通用Facebook回调转发方法
 * @param callbackType 回调类型
 * @param data 回调数据
 * @return 转发结果
 */
- (DMFacebookForwardResult)forwardGenericCallback:(NSString *)callbackType data:(nullable id)data;

/**
 * 异步通用Facebook回调转发
 * @param callbackType 回调类型
 * @param data 回调数据
 * @param completion 完成回调
 */
- (void)forwardGenericCallbackAsync:(NSString *)callbackType
                               data:(nullable id)data
                         completion:(nullable void(^)(DMFacebookForwardResult result))completion;

#pragma mark - 转发控制

/**
 * 暂停Facebook回调转发
 */
- (void)pauseForwarding;

/**
 * 恢复Facebook回调转发
 */
- (void)resumeForwarding;

/**
 * 检查转发是否已暂停
 * @return YES表示已暂停，NO表示正常运行
 */
- (BOOL)isForwardingPaused;

/**
 * 清空待转发的回调队列
 */
- (void)clearPendingForwards;

/**
 * 获取待转发回调数量
 * @return 待转发回调数量
 */
- (NSUInteger)getPendingForwardCount;

#pragma mark - 错误处理

/**
 * Facebook回调转发错误处理器
 * @param error 错误信息
 * @param callbackType 回调类型
 * @param data 回调数据
 */
typedef void(^DMFacebookForwardErrorHandler)(NSError *error, NSString *callbackType, id _Nullable data);

/**
 * 设置Facebook回调转发错误处理器
 * @param errorHandler 错误处理器
 */
- (void)setForwardErrorHandler:(nullable DMFacebookForwardErrorHandler)errorHandler;

#pragma mark - 统计和监控

/**
 * 获取Facebook回调转发统计信息
 * @return 统计信息，如果未启用统计则返回nil
 */
- (nullable DMFacebookForwardStatistics *)getForwardStatistics;

/**
 * 重置Facebook回调转发统计信息
 */
- (void)resetForwardStatistics;

/**
 * 获取Facebook回调转发性能报告
 * @return 性能报告字典
 */
- (NSDictionary *)getPerformanceReport;

/**
 * 获取Facebook回调转发历史记录
 * @param limit 限制返回的记录数量，0表示返回所有记录
 * @return 历史记录数组
 */
- (NSArray *)getForwardHistory:(NSUInteger)limit;

#pragma mark - 调试支持

/**
 * 获取Facebook回调转发器调试信息
 * @return 调试信息字典
 */
- (NSDictionary *)getDebugInfo;

/**
 * 验证Facebook回调转发器状态
 * @return YES表示状态正常，NO表示存在问题
 */
- (BOOL)validateForwarderState;

/**
 * 导出Facebook回调转发日志
 * @param limit 限制导出的日志数量，0表示导出所有日志
 * @return JSON格式的日志字符串，失败时返回nil
 */
- (nullable NSString *)exportForwardLogWithLimit:(NSUInteger)limit;

/**
 * 模拟Facebook回调（仅用于测试）
 * @param callbackType 回调类型
 * @param data 回调数据
 * @return 转发结果
 */
- (DMFacebookForwardResult)simulateCallback:(NSString *)callbackType data:(nullable id)data;

@end

NS_ASSUME_NONNULL_END